package vista.paneles;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import java.awt.GridBagLayout;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.MouseListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import logica.EntidadRol;

@SuppressWarnings("serial")
public class PanelEntidadRelacion extends JPanel {
	
	private static final String TITULO_COL_ENTIDAD = "Entidad";
	private static final String TITULO_COL_ROL = "Rol";
	private static final String TITULO_COL_CARD_MIN = "Min";
	private static final String TITULO_COL_CARD_MAX = "Max";
	private static final String TITULO_COL_DATO_VIEJO = "Dato Viejo";
	private static final String TITULO_COL_DATO_NUEVO = "Dato Nuevo";

	private static final int NUM_COL_DATO_VIEJO = 4; // guarda la entidad vieja, por si se cancela la edicion
	private static final int NUM_COL_DATO_NUEVO = 5; //
	
	private JButton botonAgregar;
	private JButton botonEditar;
	private JButton botonQuitar;
	
	private DefaultTableModel modelo;
	private JTable tabla;
	
	public PanelEntidadRelacion() 
	{
		super();
		this.setBorder(BorderFactory.createTitledBorder("Entidades"));
		
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{280, 0};
		gridBagLayout.rowHeights = new int[]{150, 60, 0};
		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
		
		this.setLayout(gridBagLayout);
		
		agregarTabla();
		agregarPanelBotones();
	}
	
	/* para los datos */
	public List<EntidadRol> getEntidadesRol()
	{
		List<EntidadRol> entidadesRol = new LinkedList<EntidadRol>();
		
		for (int entidadNum = 0; entidadNum < this.modelo.getRowCount(); entidadNum++)
			entidadesRol.add((EntidadRol)this.modelo.getValueAt(entidadNum, NUM_COL_DATO_NUEVO));
		
		return entidadesRol;
	}
	
	/*para eventos*/
	public void agregarEntidadRol(EntidadRol entidadRol)
	{
		Object[] fila = new Object[6];
		
		setValoresFila(entidadRol, fila);
	
		fila[NUM_COL_DATO_VIEJO] = new EntidadRol(entidadRol);
		fila[NUM_COL_DATO_NUEVO] = new EntidadRol(entidadRol);
		
		this.modelo.addRow(fila);
	}
	
	public void actualizarFilaEntidadRol(EntidadRol entNueva)
	{
		EntidadRol entVieja = (EntidadRol)this.modelo.getValueAt(this.tabla.getSelectedRow(), NUM_COL_DATO_VIEJO) ;
		
	//	entVieja.actualizarEntidadRol(entNueva);
		
		Object[] fila = new Object[6];
		
		setValoresFila(entNueva, fila);
	
		fila[NUM_COL_DATO_VIEJO] = entVieja;
		fila[NUM_COL_DATO_NUEVO] = entNueva;
		
		this.quitarEntidadRol();
		
		this.modelo.addRow(fila);
	}
	
	private void setValoresFila(EntidadRol entidadRol, Object[] fila)
	{
		fila[0] = entidadRol.getEntidad();
		fila[1] = entidadRol.getRol();
		
		if (entidadRol.getCardinalidadMin() == -1)
			fila[2] = "n";
		else 
			fila[2] = entidadRol.getCardinalidadMin();
		
		if (entidadRol.getCardinalidadMax() == -1)
			fila[3] = "n";
		else
			fila[3] = entidadRol.getCardinalidadMax();
	}
	
	public void agregarEntidadesRol(List<EntidadRol> entidadesRol)
	{
		Iterator<EntidadRol> entidadRol = entidadesRol.iterator();
		
		while(entidadRol.hasNext())
			this.agregarEntidadRol(entidadRol.next());
	}
	
	public void quitarEntidadRol()
	{
		int filaSeleccionada = this.tabla.getSelectedRow();
		
		if (filaSeleccionada == -1)
			return;
			
		this.modelo.removeRow(filaSeleccionada);
	}
	
	public EntidadRol getEntidadRolSeleccionada()
	{
		if (this.tabla.getSelectedRow() == -1)
			return null;		
			
		return (EntidadRol) this.modelo.getValueAt(this.tabla.getSelectedRow(), NUM_COL_DATO_NUEVO) ;
	}
		
	public void escucharEventosBotonNuevo(MouseListener controlador)
	{
		this.botonAgregar.addMouseListener(controlador);
	}
	
	public void escucharEventosBotonEditar(MouseListener controlador)
	{
		this.botonEditar.addMouseListener(controlador);
	}
	
	public void escucharEventosBotonEliminar(MouseListener controlador)
	{
		this.botonQuitar.addMouseListener(controlador);
	}
	
	/* para dibujar */
	private void agregarTabla() 
	{
		modelo = new DefaultTableModel();
		
		tabla = new JTable(modelo);
		JScrollPane jScrollPane1 = new JScrollPane(tabla);

		GridBagConstraints gbc_jScrollPane1 = new GridBagConstraints();
		gbc_jScrollPane1.fill = GridBagConstraints.BOTH;
		gbc_jScrollPane1.insets = new Insets(0, 0, 5, 0);
		gbc_jScrollPane1.gridx = 0;
		gbc_jScrollPane1.gridy = 0;
		
		this.add(jScrollPane1, gbc_jScrollPane1);

		
		modelo.addColumn(TITULO_COL_ENTIDAD);
		modelo.addColumn(TITULO_COL_ROL);
		modelo.addColumn(TITULO_COL_CARD_MIN);
		modelo.addColumn(TITULO_COL_CARD_MAX);
		modelo.addColumn(TITULO_COL_DATO_VIEJO);
		modelo.addColumn(TITULO_COL_DATO_NUEVO);
		
		tabla.getColumnModel().getColumn(NUM_COL_DATO_VIEJO).setMaxWidth(0);
		tabla.getColumnModel().getColumn(NUM_COL_DATO_VIEJO).setMinWidth(0);
		tabla.getColumnModel().getColumn(NUM_COL_DATO_VIEJO).setPreferredWidth(0);
		
		tabla.getColumnModel().getColumn(NUM_COL_DATO_NUEVO).setMaxWidth(0);
		tabla.getColumnModel().getColumn(NUM_COL_DATO_NUEVO).setMinWidth(0);
		tabla.getColumnModel().getColumn(NUM_COL_DATO_NUEVO).setPreferredWidth(0);
	}

	private void agregarPanelBotones()
	{
		JPanel panel = new JPanel();
	
		GridBagConstraints gbc_panel = new GridBagConstraints();
		gbc_panel.fill = GridBagConstraints.HORIZONTAL;
		gbc_panel.gridx = 0;
		gbc_panel.gridy = 1;
		this.add(panel, gbc_panel);
		
		GridBagLayout gbl_panel = new GridBagLayout();
		gbl_panel.columnWidths = new int[]{60, 60, 60, 0};
		gbl_panel.rowHeights = new int[]{20, 0};
		gbl_panel.columnWeights = new double[]{1.0, 1.0, 1.0, Double.MIN_VALUE};
		gbl_panel.rowWeights = new double[]{1.0, Double.MIN_VALUE};
		
		panel.setLayout(gbl_panel);
		
		botonAgregar = new JButton("Agregar");
		agregarBoton(panel, botonAgregar, 0);
		
		botonEditar = new JButton("Editar");
		agregarBoton(panel, botonEditar, 1);
		
		botonQuitar = new JButton("Quitar");
		agregarBoton(panel, botonQuitar, 2);
	}

	private void agregarBoton(JPanel panel, JButton btn, int nroColumna)
	{
		GridBagConstraints gbc_btn = new GridBagConstraints();
		gbc_btn.fill = GridBagConstraints.HORIZONTAL;
		gbc_btn.insets = new Insets(5, 5, 0, 5);
		gbc_btn.gridx = nroColumna;
		gbc_btn.gridy = 0;
		
		panel.add(btn, gbc_btn);
	}
		
}